def log(*args):
    print(*args)


def is_punctuation(char):
    """
    检查给定的字符是否为 JSON 中的标点符号
    参数：
        char: str - 要检查的字符
    返回：
        bool - 如果字符是标点符号返回 True，否则返回 False
    """
    return char in '{}:,[],'


def is_integer(char):
    """
    检查给定的字符是否为数字
    参数：
        char: str - 要检查的字符
    返回：
        bool - 如果字符是数字返回 True，否则返回 False
    """
    return char.isdigit()


def extract_string(json_string, start_index):
    """
    从给定的索引开始提取 JSON 字符串，并返回提取的字符串及结束索引
    参数：
        json_string: str - 要从中提取字符串的 JSON 格式字符串
        start_index: int - 开始提取的索引
    返回：
        tuple - 包含提取的字符串及结束索引的元组
    """
    end_index = start_index + 1
    while end_index < len(json_string) and json_string[end_index] != '"':
        end_index += 1
    return json_string[start_index + 1:end_index], end_index + 1


def extract_integer(json_string, start_index):
    """
    从给定的索引开始提取 JSON 整数，并返回提取的整数及结束索引
    参数：
        json_string: str - 要从中提取整数的 JSON 格式字符串
        start_index: int - 开始提取的索引
    返回：
        tuple - 包含提取的整数及结束索引的元组
    """
    end_index = start_index
    while end_index < len(json_string) and is_integer(json_string[end_index]):
        end_index += 1
    return json_string[start_index:end_index], end_index


def json_tokens(json_string):
    """
    将 JSON 格式字符串解析为 token 列表
    参数：
        json_string: str - 要解析的 JSON 格式字符串
    返回：
        list - 包含解析后 token 的列表
    """
    results = []
    i = 0
    while i < len(json_string):
        if is_punctuation(json_string[i]):
            results.append(json_string[i])
            i += 1
        elif json_string[i] == ' ':
            i += 1
        elif json_string[i] == '"':
            word, end_index = extract_string(json_string, i)
            results.append(word)
            i = end_index
        elif is_integer(json_string[i]):
            num, end_index = extract_integer(json_string, i)
            results.append(num)
            i = end_index
    return results


def test_json_tokens():
    string1 = '{"name": "🍉","height": 169}'
    num1 = ["{", "name", ":", "🍉", ",", "height", ":", "169", "}"]
    log(json_tokens(string1))
    ensure(json_tokens(string1) == num1, 'testJsonTokens1')

    string2 = '[{"student": 1}, {"student": 2}]'
    num2 = ["[", "{", "student", ":", "1", "}",
            ",", "{", "student", ":", "2", "}", "]"]
    ensure(json_tokens(string2) == num2, 'testJsonTokens2')

    string3 = '{}'
    num3 = ["{", "}"]
    ensure(json_tokens(string3) == num3, 'testJsonTokens3')


def ensure(condition, message):
    if not condition:
        log('*** 测试失败:', message)
    else:
        log("成功")


def main():
    test_json_tokens()


if __name__ == '__main__':
    main()
